# 포워딩과 리다이렉트

INTRO

포워딩과 리다이렉트는 JSP환경에서 다른 페이지로 이동하는 페이지 전환 기능들입니다.
이 두가지의 기능은 페이지를 전환하는 주체가 다르다는 차이점을 가지고 있습니다.

# 포워딩(Forwarding)

포워딩

페이지 전환 주체가 서버입니다. 따라서 URL 주소가 바뀌지 않고도 서버 내부의 동작을 통해 다른 응답을 클라이언트에게 줄 수 있습니다.

웹 컨테이너(Web Container) 차원에서 페이지 이동만 있는 것입니다. 실제로 클라이언트는 다른 페이지로 이동을 했는지 알 수 없습니다. 그렇기 때문에 웹 브라우저에는 최초에 호출한 URL이 표시되며 이동한 페이지의 URL 정보는 볼 수 없습니다. 동일한 웹 컨테이너에 있는 페이지로만 이동 할 수 있습니다.

포워딩은 클라이언트와 통신없이 서버에서만 처리되는 것이기 때문에 리다이렉트보다 나은 성능을 보여줍니다. 그리고 현재 실행중인 페이지와 포워딩에 의해 호출될 페이지는 Request와 Response 객체를 공유합니다. 객체를 요청에 담고 해당 요청을 사용할 다음 자원에 전송한다는 뜻입니다.

간단히 말하여 말 그대로 Forward(건내주기)한다는 것입니다. 따라서 사용자가 최초로 요청한 요청정보는 다음 URL에서도 유효합니다.

# 리다이렉트(Redirect)

리다이렉트

페이지 전환 주체가 클라이언트입니다. 서버에서 클라이언트에서 요청한 URL에 대한 응답으로 다른 URL로 재접속 하라는 명령을 보내는 것을 말합니다.

웹 컨테이너(Web Container)는 sendRedirect() 메서드가 호출되어 리다이렉트(Redirect) 명령이 들어오면 웹 브라우저에게 다른 페이지로 이동하라고 명령합니다. 이 명령에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 요청을 보낼 새로운 URL을 포함합니다. 그러면 웹 브라우저는 URL을 지시된 주소로 바꾸고 그 주소로 이동합니다. 다른 웹 컨테이너에 있는 주소로 이동이 가능하며 새로운 페이지에서는 Request와 Response 객체가 새롭게 생성됩니다.

리다이렉트는 추가적으로 발생한 처리 때문에 포워딩보다 느립니다. 중요한 것은 마지막으로 수행하는 작업은 새로운 요청에 의한 것이고, 이것을 클라이언트가 알고있기 때문에 브라우저창의 주소가 처음 요청한 주소가 아닌 다시 요청을 보낼 새로운 주소값으로 변합니다. 간단히 말하여 최초 요청을 받은 첫 번째 URL에서 클라이언트에 Redirect할 두 번째 URL을 리턴하고, 클라이언트는 전혀 새로운 요청을 생성하여 두 번째 URL에 다시 요청을 보내는 것입니다. 따라서 처음 보냈던 요청정보는 더이상 유효하지 않습니다.

# 포워드와 리다이렉트의 사용

포워드는 특정 URL에 대해 외부에 공개되지 말아야 하는 부분을 가리는데 사용하거나 조회를 위해 사용해야 합니다. 스프링의 경우 /WEB-INF에 있는 view에 대한 정보들이 외부에 직접 공개되지 말아야할 때 내부에서 포워딩을 통해 /WEB-INF 경로를 가리키도록 합니다.

리다이렉트는 클라이언트의 요청에 의해 서버 DB에 변화가 생기는 작업에 사용해야 합니다. 예를 들어 DB의 유저 테이블을 변경하는 회원가입과 같은 경우에는 리다이렉트가 사용되어야 요청을 중복해서 보내는 것을 방지할 수 있습니다.

# 참고자료

  • https://sdevstudy.tistory.com/26
  • https://kotlinworld.com/329